//
// Created by martin on 9/27/21.
//

#ifndef FTPSERVER2_0_DATACHANNEL_H
#define FTPSERVER2_0_DATACHANNEL_H

#include <sys/types.h>
#include <event2/bufferevent.h>

/**
 * 数据通道要传输的数据类型
 */
typedef enum {
    DataChannel_DataType_Mem = 0, // 内存数据类型
    DataChannel_DataType_File     // 文件数据类型
}DataChannel_DataType;

/**
 * 数据通道的传输方式
 * @note 一个数据通道只能用作Send（发送）或Receive（接收）数据功能，二选一，不能同时发送和接收数据
 */
typedef enum {
    DataChannel_Transfer_Type_Send = 0, // 发送
    DataChannel_Transfer_Type_Receive   // 接收
}DataChannel_Transfer_Type;

/**
 * 数据通道状态
 */
typedef enum {
    DataChannel_Status_Idle = 0,
    DataChannel_Status_Busy,
}DataChannel_Status;

typedef struct datachannel{
    DataChannel_Status status; // 状态
    int err_counter; // 错误计数

    DataChannel_DataType data_type; // 数据类型
    DataChannel_Transfer_Type transfer_type; // 传输方式

    /* 要传输的数据
     * data_type为 DataChannel_DataType_File 时，fd才有意义
     * data_type为 DataChannel_DataType_Mem 时, Buf才有意义
     * */
    union {
        // 数据缓冲区
        struct {
            void *data_ptr; // 要传输的数据缓冲区首地址
            int size; // 要传输的数据缓冲区大小
        }Buf;

        int fd; // 要传输的文件
    }Data;

    // 文件传输时，有时需要记录当前传输到的位置，下次开始传输的位置就是偏移的位置
    ssize_t offset; // 文件偏移

}DataChannel;

DataChannel* datachannel_new();
void datachannel_free(DataChannel **channel);

#endif //FTPSERVER2_0_DATACHANNEL_H
